bitkeeper revision 1.1236.31.2 (42361633CjfrivegSB7RM_ZE_lYofg)
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Mon, 14 Mar 2005 22:54:43 +0000 (22:54 +0000)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Mon, 14 Mar 2005 22:54:43 +0000 (22:54 +0000)
More work on ia64 multiple domains

xen/arch/ia64/domain.c
xen/arch/ia64/patch/linux-2.6.7/system.h
xen/arch/ia64/process.c
xen/arch/ia64/regionreg.c
xen/arch/ia64/xenmisc.c
xen/arch/ia64/xensetup.c
xen/drivers/char/console.c
xen/include/asm-ia64/config.h

index abdcf203a560b50bb42502cf04b61dbd7f954ca0..82fe694e888265fd886675fe0fac3b61bf581acc 100644 (file)
@@ -102,7 +102,7 @@ void startup_cpu_idle_loop(void)
 {
     /* Just some sanity to ensure that the scheduler is set up okay. */
     ASSERT(current->domain == IDLE_DOMAIN_ID);
-    domain_unpause_by_systemcontroller(current);
+    domain_unpause_by_systemcontroller(current->domain);
     __enter_scheduler();
 
     /*
index a384ce4df83b96e69bc27a06817edcca04ad94a0..f0209984a5b77307e41704b903a903cb9c1392f1 100644 (file)
@@ -1,5 +1,5 @@
---- /home/djm/src/xen/xeno-ia64.bk/xen/linux-2.6.7/include/asm-ia64/system.h   2005-01-23 13:23:36.000000000 -0700
-+++ /home/djm/src/xen/xeno-ia64.bk/xen/include/asm-ia64/system.h       2004-09-17 18:27:22.000000000 -0600
+--- ../../linux-2.6.7/include/asm-ia64/system.h        2005-01-31 11:15:23.000000000 -0700
++++ include/asm-ia64/system.h  2005-03-14 11:31:12.000000000 -0700
 @@ -24,8 +24,16 @@
   * 0xa000000000000000+2*PERCPU_PAGE_SIZE
   * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
@@ -35,9 +35,9 @@
  #else
  # define switch_to(prev,next,last)    __switch_to(prev, next, last)
  #endif
-+#ifdef XEN
-+#undef switch_to
-+#endif
++//#ifdef XEN
++//#undef switch_to
++//#endif
  
  /*
   * On IA-64, we don't want to hold the runqueue's lock during the low-level context-switch,
index a15c6f53a812babda4a9030e8d5f7d380a63392a..08fd4d0c545fa446b6f02b31078bdea6329dccdf 100644 (file)
@@ -148,8 +148,8 @@ void reflect_interruption(unsigned long ifa, unsigned long isr, unsigned long it
                vector &= ~0xf;
                if (vector != IA64_DATA_TLB_VECTOR &&
                    vector != IA64_DATA_TLB_VECTOR) {
-panic_domain(regs,"psr.ic off, delivering fault=%lx,iip=%p,isr=%p,PSCB.iip=%p\n",
-       vector,regs->cr_iip,isr,PSCB(ed,iip));
+panic_domain(regs,"psr.ic off, delivering fault=%lx,iip=%p,ifa=%p,isr=%p,PSCB.iip=%p\n",
+       vector,regs->cr_iip,ifa,isr,PSCB(ed,iip));
                        
                }
 //printf("Delivering NESTED DATA TLB fault\n");
@@ -284,6 +284,9 @@ if (address < 0x4000) printf("WARNING: page_fault @%p, iip=%p\n",address,iip);
                else {
                        // should never happen.  If it does, region 0 addr may
                        // indicate a bad xen pointer
+                       printk("*** xen_handle_domain_access: exception table"
+                               " lookup failed, iip=%p, addr=%p, spinning...\n",
+                               iip,address);
                        panic_domain(regs,"*** xen_handle_domain_access: exception table"
                                " lookup failed, iip=%p, addr=%p, spinning...\n",
                                iip,address);
@@ -816,7 +819,7 @@ ia64_handle_reflection (unsigned long ifa, struct pt_regs *regs, unsigned long i
        unsigned long itir = vcpu_get_itir_on_fault(ed,ifa);
 
        if (!(psr & IA64_PSR_CPL)) {
-               panic_domain(regs,"ia64_handle_reflection: reflecting with priv=0!!\n");
+               printk("ia64_handle_reflection: reflecting with priv=0!!\n");
        }
        // FIXME: no need to pass itir in to this routine as we need to
        // compute the virtual itir anyway (based on domain's RR.ps)
index d53b01f8950f61327a5194e6ab817af33b6c90ec..694b7fd3f652acb11f031768ef87e4145ed27dc0 100644 (file)
@@ -262,7 +262,12 @@ int set_one_rr(unsigned long rr, unsigned long val)
        newrrv.rrval = 0;
        newrid = ed->domain->starting_rid + rrv.rid;
 
-       if (newrid > ed->domain->ending_rid) return 0;
+       if (newrid > ed->domain->ending_rid) {
+               printk("can't set rr%d to %lx, starting_rid=%lx,"
+                       "ending_rid=%lx, val=%lx\n", rreg, newrid,
+                       ed->domain->starting_rid,ed->domain->ending_rid,val);
+               return 0;
+       }
 
        memrrv.rrval = rrv.rrval;
        if (rreg == 7) {
@@ -335,21 +340,21 @@ if (!ed->vcpu_info) { printf("Stopping in init_all_rr\n"); dummy(); }
 
 /* XEN/ia64 INTERNAL ROUTINES */
 
-unsigned long physicalize_rid(struct exec_domain *ed, unsigned long rid)
+unsigned long physicalize_rid(struct exec_domain *ed, unsigned long rrval)
 {
        ia64_rr rrv;
            
-       rrv.rrval = rid;
+       rrv.rrval = rrval;
        rrv.rid += ed->domain->starting_rid;
        return rrv.rrval;
 }
 
 unsigned long
-virtualize_rid(struct exec_domain *ed, unsigned long rid)
+virtualize_rid(struct exec_domain *ed, unsigned long rrval)
 {
        ia64_rr rrv;
            
-       rrv.rrval = rid;
+       rrv.rrval = rrval;
        rrv.rid -= ed->domain->starting_rid;
        return rrv.rrval;
 }
@@ -365,6 +370,7 @@ unsigned long load_region_regs(struct exec_domain *ed)
 {
        unsigned long rr0, rr1,rr2, rr3, rr4, rr5, rr6, rr7;
        // TODO: These probably should be validated
+       unsigned long bad = 0;
 
        if (ed->vcpu_info->arch.metaphysical_mode) {
                ia64_rr rrv;
@@ -383,25 +389,28 @@ unsigned long load_region_regs(struct exec_domain *ed)
                set_rr_no_srlz(0x8000000000000000L, rr4);
                set_rr_no_srlz(0xa000000000000000L, rr5);
                set_rr_no_srlz(0xc000000000000000L, rr6);
+               // skip rr7 when in metaphysical mode
        }
        else {
-               rr0 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[0]);
-               rr1 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[1]);
-               rr2 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[2]);
-               rr3 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[3]);
-               rr4 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[4]);
-               rr5 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[5]);
-               rr6 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[6]);
-               set_one_rr(0x0000000000000000L, rr0);
-               set_one_rr(0x2000000000000000L, rr1);
-               set_one_rr(0x4000000000000000L, rr2);
-               set_one_rr(0x6000000000000000L, rr3);
-               set_one_rr(0x8000000000000000L, rr4);
-               set_one_rr(0xa000000000000000L, rr5);
-               set_one_rr(0xc000000000000000L, rr6);
-               ia64_srlz_d();
+               rr0 =  ed->vcpu_info->arch.rrs[0];
+               rr1 =  ed->vcpu_info->arch.rrs[1];
+               rr2 =  ed->vcpu_info->arch.rrs[2];
+               rr3 =  ed->vcpu_info->arch.rrs[3];
+               rr4 =  ed->vcpu_info->arch.rrs[4];
+               rr5 =  ed->vcpu_info->arch.rrs[5];
+               rr6 =  ed->vcpu_info->arch.rrs[6];
+               rr7 =  ed->vcpu_info->arch.rrs[7];
+               if (!set_one_rr(0x0000000000000000L, rr0)) bad |= 1;
+               if (!set_one_rr(0x2000000000000000L, rr1)) bad |= 2;
+               if (!set_one_rr(0x4000000000000000L, rr2)) bad |= 4;
+               if (!set_one_rr(0x6000000000000000L, rr3)) bad |= 8;
+               if (!set_one_rr(0x8000000000000000L, rr4)) bad |= 0x10;
+               if (!set_one_rr(0xa000000000000000L, rr5)) bad |= 0x20;
+               if (!set_one_rr(0xc000000000000000L, rr6)) bad |= 0x40;
+               if (!set_one_rr(0xe000000000000000L, rr7)) bad |= 0x80;
        }
-       rr7 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[7]);
-       set_one_rr(0xe000000000000000L, rr7);
        ia64_srlz_d();
+       if (bad) {
+               panic_domain(0,"load_region_regs: can't set! bad=%lx\n",bad);
+       }
 }
index a5ae5a37ed10f8b730cf033626bd0174cc893e39..7f215470a8ac9c0f89b61bcf2dc02016781124d6 100644 (file)
@@ -246,12 +246,12 @@ void cs01foo(void) {}
 // context_switch
 void context_switch(struct exec_domain *prev, struct exec_domain *next)
 {
-printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
-printk("@@@@@@ context switch from domain %d (%x) to domain %d (%x)\n",
-prev->domain->id,(long)prev&0xffffff,next->domain->id,(long)next&0xffffff);
-printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
-if (prev->domain->id == 1 && next->domain->id == 0) cs10foo();
-if (prev->domain->id == 0 && next->domain->id == 1) cs01foo();
+//printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+//printk("@@@@@@ context switch from domain %d (%x) to domain %d (%x)\n",
+//prev->domain->id,(long)prev&0xffffff,next->domain->id,(long)next&0xffffff);
+//printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+//if (prev->domain->id == 1 && next->domain->id == 0) cs10foo();
+//if (prev->domain->id == 0 && next->domain->id == 1) cs01foo();
        switch_to(prev,next,prev);
        clear_bit(EDF_RUNNING, &prev->ed_flags);
        //if (!is_idle_task(next->domain) )
@@ -265,11 +265,16 @@ void panic_domain(struct pt_regs *regs, const char *fmt, ...)
        char buf[128];
        struct exec_domain *ed = current;
        static volatile int test = 1;   // so can continue easily in debug
+       extern spinlock_t console_lock;
+       unsigned long flags;
     
-       printf("$$$$$ PANIC in domain %d:",ed->domain->id);
+       printf("$$$$$ PANIC in domain %d (k6=%p): ",
+               ed->domain->id, ia64_get_kr(IA64_KR_CURRENT));
        va_start(args, fmt);
        (void)vsnprintf(buf, sizeof(buf), fmt, args);
        va_end(args);
+       printf(buf);
        if (regs) show_registers(regs);
-       while(test);
+       domain_pause_by_systemcontroller(current->domain);
+       //while(test);
 }
index 3e355a6d4f25c8bd1ce10f3185f667ed7689fd2d..a72b25174d52c9cfbba5f24c752f01d086e70863 100644 (file)
@@ -389,7 +389,7 @@ printk("About to call init_trace_bufs()\n");
     console_endboot(cmdline && strstr(cmdline, "tty0"));
 #endif
 
-    domain_unpause_by_systemcontroller(current);
+    domain_unpause_by_systemcontroller(current->domain);
 #ifdef CLONE_DOMAIN0
     {
     int i;
index a69b5d19d846613099439cd201f2a3ea9620d256..8a0f2caecb5d50655c93f5bdd5b7a3d5f1be6963 100644 (file)
@@ -644,3 +644,4 @@ void __out_of_line_bug(int line)
  * indent-tabs-mode: nil
  * End:
  */
+
index 209d4c7b5991ee37e473d287bac6a12867e14afe..d7d29fd454a164cfd62d662f797d06816d0bf691 100644 (file)
@@ -1,7 +1,6 @@
 // control flags for turning on/off features under test
-//#undef CLONE_DOMAIN0
-#define CLONE_DOMAIN0 1
-//#undef CLONE_DOMAIN0
+#undef CLONE_DOMAIN0
+//#define CLONE_DOMAIN0 3
 #define USER_ACCESS
 
 // manufactured from component pieces